package com.zxk.service.impl;

import com.sun.jna.platform.win32.WinDef;
import com.zxk.constant.JNAConstants;
import com.zxk.constant.ParamConstants;
import com.zxk.constant.PicConstants;
import com.zxk.enums.Coord;
import com.zxk.service.AbstractMyTask;
import com.zxk.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 宝图任务
 *
 * @author: 舟小亢
 * @date: 2023-08-12 22:03
 */
public class MapTaskImpl extends AbstractMyTask {

    private static Logger LOG = LoggerFactory.getLogger(MapTaskImpl.class);

    public MapTaskImpl(WinDef.HWND hwnd_0, WinDef.HWND hwnd_1, WinDef.HWND hwnd_2) {
        super(hwnd_0, hwnd_1, hwnd_2);
    }

    @Override
    public boolean execute() throws Exception {
        LOG.info("【宝图任务】开始！");

        // 先检查任务列表是否存在，存在则直接点击开始任务
        MouseUtil.dragMove(hwnd_1, Coord.TASK_LIST_WHELL.getX(), Coord.TASK_LIST_WHELL.getY(), 0, 1000);
        if (FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.宝图_任务列表标志, 3)) {
            LOG.info("【宝图任务】任务已接，继续战斗！");
            return true;
        }

        // 切换组合1
        if (!changeAssistantTeam(Coord.ASSISTANT_FRIEND_1)) {
            LOG.info("【宝图任务】切换助战组合[1]失败！");
        }
        LOG.info("【宝图任务】切换助战组合[1]成功！");

        // 点击活动
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_活动)) {
            return false;
        }

        // 找到日常活动并点击
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_日常活动)) {
            return false;
        }
        // 点击参加藏宝图任务
        MouseUtil.dragMove(hwnd_1, Coord.ACTIVITY_WHELL.getX(), Coord.ACTIVITY_WHELL.getY(), 0, 1000);

        for (int i = 0; i < ParamConstants.UNIFY_TIMES; i++) {
            // 先检查是否完成
            pic = FuzzyPicUtil.findPic(hwnd_0, PicConstants.宝图_任务完成, 2, 0.95);
            if (pic.isFinded()) {
                // 摁ESC，退出
                ThreadUtil.sleep1();
                KeyUtil.kClick(hwnd_1, JNAConstants.VK_ESCAPE);
                LOG.info("【宝图任务】已完成！");
                return false;
            }
            // 查找宝图任务logo
            pic = FuzzyPicUtil.findPic(hwnd_0, PicConstants.宝图_任务图标, 2);
            if (pic.isFinded()) {
                break;
            }
            // 如果没找到下拉滑动屏幕寻找图标
            MouseUtil.dragMove(hwnd_1, Coord.ACTIVITY_WHELL.getX(), Coord.ACTIVITY_WHELL.getY(), 0, -100);

            // 一直没找到
            if (i == ParamConstants.UNIFY_TIMES - 1) {
                LOG.error("【宝图任务】任务失败！");
                return false;
            }
        }
        MouseUtil.lClickRandom(hwnd_1,
                pic.getPicX() + Coord.ATTEND_TASK_DXY.getX(),
                pic.getPicY() + Coord.ATTEND_TASK_DXY.getY());

        // 点击接受任务
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.宝图_任务接受)) {
            return false;
        }

        // 点击一次屏幕消除字幕
        FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_活动);

        // 点击任务列表开始任务
        MouseUtil.dragMove(hwnd_1, Coord.TASK_LIST_WHELL.getX(), Coord.TASK_LIST_WHELL.getY(), 0, 1000);
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.宝图_任务列表标志)) {
            LOG.error("【宝图任务】未找到任务，任务失败！");
            return false;
        }

        return true;
    }

    @Override
    public boolean checkTask() throws Exception {
        for (int i = 0; i < 30; i++) {
            LOG.info("开始检查宝图任务完成情况,检查第[{}]次", i + 1);
            // 查找战斗
            if (FuzzyPicUtil.findPic(hwnd_0, PicConstants.公共_战斗中, 10).isFinded()) {
                // 战斗中就睡30秒
                LOG.info("【宝图任务】战斗中，睡眠30秒！");
                ThreadUtil.sleep(30000);
                continue;
            }

            // 首先初始化，如果找不到活动，说明任务未完成
            if (!iniState(3, 15000)) {
                continue;
            }

            // 查找并点击活动
            if (!PixelPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_活动)) {
                continue;
            }

            // 找到日常活动并点击
            if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_日常活动)) {
                return false;
            }
            // 将屏幕拉到最下方,找任务完成图标
            MouseUtil.dragMove(hwnd_1, Coord.ACTIVITY_WHELL.getX(), Coord.ACTIVITY_WHELL.getY(), 0, -1000);
            pic = FuzzyPicUtil.findPicM(hwnd_0, new String[]{PicConstants.宝图_任务完成}, 5);
            if (pic.isFinded()) {
                LOG.info("【宝图任务】已完成！");
                ThreadUtil.sleep1();
                // 点击ESC
                KeyUtil.kClick(hwnd_1, JNAConstants.VK_ESCAPE);
                return true;
            }
            // 如果没找到，点击ESC，去列表寻找
            KeyUtil.kClick(hwnd_1, JNAConstants.VK_ESCAPE);

            // 滚动任务栏进行抓鬼任务
            MouseUtil.dragMove(hwnd_1, Coord.TASK_LIST_WHELL.getX(), Coord.TASK_LIST_WHELL.getY(), 0, 1000);

            // 找到抓鬼任务,点击并开始
            if (!FuzzyPicUtil.findPic(hwnd_0, PicConstants.宝图_任务列表标志, 5).isFinded()) {
                // 如果列表没找到，继续下一项任务
                LOG.info("【宝图任务】任务已完成或未领取，退出！");
                return false;
            }
            // 如果列表找到继续任务
            LOG.info("【宝图任务】找到未完成的任务，继续运行！");
            ThreadUtil.sleep1();
            FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.宝图_任务列表标志, 5);
        }
        LOG.info("【宝图任务】完成！");
        return true;
    }
}
